package ejercicio.practica6;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.Scanner;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author manolo
 */
public class UsaProdMatConcurrente {

    public static void main(String[] args) throws InterruptedException {
        Random rm = new Random();
        int m, n;
        int limSup, limInf=0;
        Scanner teclado = new Scanner(System.in);
        int numNucleos = Runtime.getRuntime().availableProcessors();
        int numHilos;
        int umbral;
        float Cb;

        System.out.println("Introduzca la dimensión de las filas de la matriz A: ");
        m = teclado.nextInt();
        System.out.println("Introduzca la dimensión de las columnas de la matriz A: ");
        n = teclado.nextInt();
        int[][] matrizA = new int[m][n];
        int[] matrizB = new int[n];
         System.out.println("Introduzca la constante de bloqueo (0,1): ");
        Cb= teclado.nextFloat();                
        numHilos = (int) (numNucleos/(1-Cb));
        
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                matrizA[i][j] = rm.nextInt();
            }
        }
        
        for(int i=0; i<n; i++)            
                matrizB[i] = rm.nextInt();
        
        limSup = m/numHilos;
        umbral = m/numHilos;
        ProdMatConcurrente[] vectorHilos = new ProdMatConcurrente[numHilos];

        for (int i = 0; i < numHilos; ++i) {
            vectorHilos[i] = new ProdMatConcurrente(m, n, limInf, limSup, matrizA, matrizB);
            limInf = limSup;
            limSup += umbral;
        }

        Date d = new Date();
        DateFormat df = new SimpleDateFormat("HH:mm:ss:SSS");
        long inicCronom = System.currentTimeMillis(); //se prepara el cronometro
        d.setTime(inicCronom);

        for (int i = 0; i < m; ++i) {
            vectorHilos[i].start();
        }

        for (int i = 0; i < m; ++i) {
            vectorHilos[i].join();
        }
        long finCronom = System.currentTimeMillis(); //se para el cronometro
        d.setTime(finCronom);
        int[] resultado = vectorHilos[0].getResultado();
        System.out.println("Acabando trabajo a las " + df.format(d) + " tras " + (finCronom - inicCronom) + " milisegundos");


    }

}
